package com.ht.sps.service;

import org.nutz.dao.Condition;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @author: 薄成文 13-10-17 上午9:01
 * To change this template use File | Settings | File Templates.
 */
public interface BaseService<T> {
//
//    int getMaxUpdateCount();
//
//    /**
//     * 查找大于该操作记数的所有数据
//     * @param updateCount
//     * @return
//     */
//    List<T> findByUpdateCount(int updateCount);

    void init();

    /**
     * 按主键查询单条记录
     * @param id
     * @return
     */
    T fetch(long id);

    /**
     * 复合主键专用
     *
     * @param pks
     *            键值
     * @return 对象 T
     */
    T fetchx(Object... pks);

    int deletex(Object... pks);

    /**
     * 获取最大的ID主键
     * @return
     */
    Integer getMaxId();

    /**
     * 主键是否存在
     * @param id
     * @return
     */
    boolean isExist(long id);

    /**
     * 是否存在, 复合主键专用
     * @param pks
     * @return
     */
    boolean exists(Object... pks);

    /**
     * 插入操作
     * @param t
     * @return 新插入的实体类
     */
    T insert(T t);

    /**
     * 删除操作
     * @param id
     */
    void delete(long id);

    /**
     * 删除操作
     * @param t 要删除的实体类对象，id不可为空
     */
    void delete(T t);

    /**
     * 更新操作
     * @param t
     */
    void update(T t);

    /**
     * 查询单个对象
     * @param cnd
     * @return
     */
     T findOne(Condition cnd);

    /**
     * 查询全部记录
     * @return
     */
    List<T> findAll();

//    /**
//     * 查询所有未删除的记录, 注意该方法只能用于带有deleted字段的实体类
//     * @return
//     */
//    List<T> findAllNotDeleted();

    /**
     * 分页查询
     * @param currentPage
     * @param pageSize
     * @param orderby
     * @return
     */
    List<T> findByPage(int currentPage, int pageSize, String orderby);

    /**
     * 只查询给定的字段：
     * FieldFilter.create(getEntityClass(), regex).run(new Atom() {
     * @param id
     * @param regex 字段白名单如：^id|memberId|cardGroupId$
     * @return
     */
    T fetchByFilter(long id, String regex);
    List<T> fetchByFilter(Condition cnd, String regex);

    void updateByFilter(T t, String regex);
}
